package com.example.service.impl;

import cn.hutool.json.JSONUtil;
import com.example.dao.UserDao;
import com.example.dao.impl.UserDaoImpl;
import com.example.entity.User;
import com.example.service.UserService;
import com.example.util.DBUtil;
import com.example.util.ResultUtil;

import java.sql.Connection;
import java.sql.SQLException;

public class UserServiceImpl implements UserService {

    private final UserDao userDao = new UserDaoImpl();

    /**
     * 根据用户名和密码判断是否能够登录
     * @param user
     * @return 响应的JSON字符串
     */
    @Override
    public String login(User user) {
        // 判断用户名是不是空：null，空字符串
        if (user.getUsername() == null ||
                user.getUsername().trim().isEmpty()) {
            return JSONUtil.toJsonStr(ResultUtil.fail("未填写用户名"));
        }
        // 判断密码是不是空：null，空字符
        if (user.getPassword() == null ||
                user.getPassword().trim().isEmpty()) {
            return JSONUtil.toJsonStr(ResultUtil.fail("未填写密码"));
        }
        // 校验数据库数据
        Connection connection = DBUtil.getConnection();
        /* connection连接不成功的情况：驱动类加载失败，数据库地址、账号、密码错误、数据库停服 */
        if (connection == null) {
            return JSONUtil.toJsonStr(ResultUtil.fail("服务器内部错误"));
        }
        User loginUser = null;
        try {
            loginUser = userDao.getLoginUser(connection, user);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Dao层面报错");
            /* 怎么处理？需不需向要用户告知？不需要
            需不需要向开发人员告知 */
            /* 重要的代码异常，可以存到数据库 */
        } finally {
            DBUtil.closeConnection(connection);
        }
        if (loginUser == null) {
            return JSONUtil.toJsonStr(ResultUtil.fail("用户名或密码错误"));
        } else {
            // 成功
            return JSONUtil.toJsonStr(ResultUtil.success());
        }
    }

    /**
     * 处理注册
     * @param user
     * @return 响应JSON字符串
     */
    @Override
    public String registry(User user) {
        // 用户名是不是重复了，要去查数据库
        Connection connection = DBUtil.getConnection();
        boolean exist = false;
        int i = 0;
        try {
            if (connection == null) {
                return JSONUtil.toJsonStr(ResultUtil.error());
            }
            if (userDao.getUserByUsername(connection, user.getUsername())) {
                // 用户已存在，不能重复注册
                return JSONUtil.
                        toJsonStr(ResultUtil.fail("用户名已存在"));
            }
            // 存数据
            i = userDao.insertUser(connection, user);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.closeConnection(connection);
        }
        if (i == 1) {
            return JSONUtil.toJsonStr(ResultUtil.success());
        } else {
            return JSONUtil.toJsonStr(ResultUtil.fail("注册失败"));
        }
    }
}
